"""
在类中封装属性名

问题：
    你想封装类的实例上面的“私有”数据，但是Python语言并没有访问控制。
解决方案：
    Python程序员不去依赖语言特性去封装数据，而是通过遵循一定的属性和方法命名规约来达到这个效果。
    第一个约定是任何以单下划线_开头的名字都应该是内部实现。
"""


class User:
    def __init__(self):
        # 私有属性（private）
        self.__private_name = "private name"
        # 保护型属性（protected）
        self._protected_name = "protected name"
        # 公有属性（public）
        self.public_name = "public name"

    def __private_func(self):
        print("私有方法")

    def _protected_func(self):
        print("保护型方法")

    def public_func(self):
        print("公有方法")


def use_user():
    user = User()
    # 访问属性
    print(user._User__private_name)
    print(user._protected_name)
    print(user.public_name)

    # 访问方法
    user._User__private_func()
    user._protected_func()
    user.public_func()

    # 输出结果：
    """
    private name
    protected name
    public name
    私有方法
    保护型方法
    公有方法
    """


if __name__ == '__main__':
    use_user()
